package com.boful.common.date.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang.StringUtils;

/***
 * 日期格式化工具
 * 
 * @author ligson
 *
 */
public class DateUtils {
	public static final String FORMAT_1 = "yyyyMMddHHmmss";
	public static final String FORMAT_2 = "yyyy-MM-dd HH:mm:ss";
	public static final String FORMAT_3 = "yyyy年MM月dd日 HH:mm:ss";

	/***
	 * 把text按照format格式转换为日期类型
	 * 
	 * @param format
	 *            日期格式
	 * @param text
	 *            日期文本
	 * @return Date对象
	 */
	public static Date parse(String format, String text) {
		if (format == null) {
			format = FORMAT_1;
		}
		if (text == null || StringUtils.isEmpty(text)) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			return sdf.parse(text);
		} catch (ParseException e) {
			return null;
		}
	}

	/***
	 * 将date对象格式化为format文本
	 * 
	 * @param date
	 *            要格式化的对象
	 * @param format
	 *            日期格式
	 * @return 日期文本
	 */
	public static String format(Date date, String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}

	/***
	 * 将日期文本dateText从fromFormat格式转换为toFormat格式
	 * 
	 * @param dateText
	 *            日期文本
	 * @param fromFormat
	 *            源格式
	 * @param toFormat
	 *            目标格式
	 * @return 指定格式的值
	 */
	public static String convert(String dateText, String fromFormat,
			String toFormat) {
		Date date = parse(fromFormat, dateText);
		return format(date, toFormat);
	}

	/***
	 * 从yyyyMMddHHmmss转换为yyyy年MM月dd日 HH:mm:ss
	 * 
	 * @param dateText
	 *            日期文本
	 * @return 目标格式
	 */
	public static String convert(String dateText) {
		return convert(dateText, FORMAT_1, FORMAT_3);
	}

	/***
	 * 当前日期转换
	 * 
	 * @return 默认格式
	 */
	public static String format() {
		return format(new Date(), FORMAT_1);
	}

	/***
	 * 当前日期增加day天
	 * 
	 * @param date
	 * @param day
	 * @return
	 */
	public static Date addDay(Date date, int day) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, day);
		return calendar.getTime();
	}

	/***
	 * 当前日期减少day天
	 * 
	 * @param date
	 * @param day
	 * @return
	 */
	public static Date subtractDay(Date date, int day) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - day);
		return calendar.getTime();
	}
}
